#include "../../lib/algo/Steinberg.h"

void Steinberg::applySteinberg(vector<Travail> _travails){

	printf("dans Steinberg ::: \n");
	vector<Travail> travails = _travails;
	//variables Steinberg
	int u = 9; // nombre des machines
//	int v = 0; 
// ---------------------------------------------------------------
//creation MAP execution
	Exec mExec;

	mExec.insert(Exec::value_type("0", 0.00));		
	mExec.insert(Exec::value_type("1", 0.00));		
	mExec.insert(Exec::value_type("2", 0.00));		
	mExec.insert(Exec::value_type("3", 0.00));		
	mExec.insert(Exec::value_type("4", 0.00));		
	mExec.insert(Exec::value_type("5", 0.00));		
	mExec.insert(Exec::value_type("6", 0.00));		
	mExec.insert(Exec::value_type("7", 0.00));		
	mExec.insert(Exec::value_type("8", 0.00));
/*	mExec.insert(Exec::value_type("9", 0.00));		
	mExec.insert(Exec::value_type("10", 0.00));
	mExec.insert(Exec::value_type("11", 0.00));		
	mExec.insert(Exec::value_type("12", 0.00));
	mExec.insert(Exec::value_type("13", 0.00));		*/
// ---------------------------------------------------------------

//somme de tous les duree des tous les travaux pour avoir le premier V (Steinberg V, U)
	int size = travails.size();
	int v = 0;
	for (int i = 0; i < travails.size(); i++){
		v += travails[i].getDuree1();
	}
// trouver aL, aL = Max[1<=i<=l](Ai); Ai est nombre des machines demande par le travail
	int aL = travails[0].getNbrMachine();
	for (int i = 0; i < travails.size(); i++){
		if (aL < travails[i].getNbrMachine()){
			aL = travails[i].getNbrMachine();
		}
	}//fin FOR aL
	
// trouver bL, bL = Max[1<=i<=l](Bi); Bi est la duree du travail
	int bL = travails[0].getDuree1();
	for (int i = 0; i < travails.size(); i++){
		if (bL < travails[i].getDuree1()){
			bL = travails[i].getDuree1();
		}
	}//fin FOR bL

// calculer la somme des SumSi, Si = Ai*Bi
	float SumSi = 0;
	float Si = 0;
	for (int i = 0; i < travails.size(); i++){
		Si = travails[i].getDuree1() * travails[i].getNbrMachine();
//		cout << "Steinberg: Si = " << Si << endl;
		SumSi += Si;
	}//fin FOR SumSi

// I conndition a satisfaire aL <= u
// II conndition a satisfaire bL <= v
// III conndition a satisfaire SumSL <= uv-(2aL - u)*(2bL - v) a conndition que (2bL - v)etu)*(2aL - u) soient positifs
// on va iontroduire une variable pour la partie droite de la III conndition SL

//	while()
//	if (SumSi < Steinberg::calculerSL(u, v, aL, bL)){
//		cout << "aba V : " << v << endl;
		cout << "aba Sum : " << SumSi << endl;
 		cout << "aba SL : " << Steinberg::calculerSL(u, 528, aL, bL) << endl;
//	}
	Steinberg::procedure1a(travails, u);
}

// on va iontroduire une variable pour la partie droite de la III conndition SL
float Steinberg::calculerSL(int _u,int _v,int _aL,int _bL){
//	int v = (3*_v)/4;
        int difAL = _aL+_aL-_u;
        int difBL = _bL+_bL-_v;
	float SL = 0; 

//	cout << "difAL = " << difAL << endl;
//	cout << "difBL = " << difBL << endl;

	if (difAL > 0 & difBL > 0){
		SL = _u*_v-difAL*difBL	;
	}

	return SL;
}

void Steinberg::procedure1a(vector<Travail> _travails, int u){
	vector<Travail> travails = _travails;

// "tri bull" pour avoir la liste decrementale : nbrMachine
	int size = travails.size();
	Travail tmp;
	for (int a = 0; a < size - 1; a++){
		for (int b = 1; b < size; b++){
			if (travails[b].getNbrMachine() > travails[b-1].getNbrMachine()){
				tmp = travails[b];
				travails[b] = travails[b-1];
				travails[b-1] = tmp;
			}
		}
	}

// mettre dans une liste travauxU les travaux pour lesquels le nbr. de pc. demande est superieur a u/2	

	vector<Travail> travauxU;
	vector<Travail> travauxUR;
	for (int i = 0; i < travails.size(); i++){
		if (travails[i].getNbrMachine() > u/2){
//			cout << "travail : " << travails[i].getIdTravail() << endl;
			travauxU.push_back(travails[i]);
		}
		else {
			travauxUR.push_back(travails[i]);
		}
	}
	cout << "procedure1 : nbrTX = " << travauxU.size() << endl;
	cout << "procedure1 : nbrTX = " << travauxUR.size() << endl;

// "tri bull" pour avoir la liste decrementale: Duree1
//	int size = travauxUR.size();
	Travail tmp1;
	for (int a = 0; a < travauxUR.size() - 1; a++){
		for (int b = 1; b < size; b++){
			if (travauxUR[b].getDuree1() > travauxUR[b-1].getDuree1()){
				tmp1 = travails[b];
				travauxUR[b] = travails[b-1];
				travauxUR[b-1] = tmp1;
			}
		}
	}
	

}
